#pragma once

#include<iostream>
#include"TcpServer.hpp"
#include"Log.hpp"
#include"ThreadPool.hpp"
#include"Task.hpp"

#define PORT 8081

class HttpServer{
public:
    HttpServer(int port = PORT) :port_(port), stop_(false) {

    }

    void InitServer() {
        //忽略SIGPIPE信号， 不忽略的话写入的时候，server可能会直接崩溃
        //SIGPIPE（当我们向管道写入数据时，如果对端关闭，则会产生SIGPIPE信号），对端关闭，是我们要处理的错误情况的一种
        signal(SIGPIPE, SIG_IGN);
    }

    void Loop() {

        LOG(INFO, "进入Loop循环！");
        TcpServer* tsvr = TcpServer::GetInstance(port_);
        ThreadPool* tp = ThreadPool::GetThreadPoolInstance();

        while (!stop_) {

            struct sockaddr_in peer;
            socklen_t len = sizeof(peer);
            int sock = accept(tsvr->Sock(), (sockaddr*)&peer, &len);
            
            if (sock < 0) {
                continue;
            }
            
            LOG(INFO, "Get a new link...");
            // //创建新线程去执行, 主线程继续去接受新链接
            // int* psock = new int(sock);
            // pthread_t tid;
            // pthread_create(&tid, nullptr, Entrance::HandlerRequest, psock);
            // //线程分离（子线程结束后，资源自动回收）
            // pthread_detach(tid);
            //利用线程池分派任务
            Task task(sock);
            tp->Push(task);

        }
    }

    ~HttpServer() {}
private:
    int port_;
    // TcpServer* tcp_server_;
    bool stop_;     //http服务器状态
    // ThreadPool thread_pool_;
};